package initialize

import (
	"fmt"
	"github.com/pkg/errors"
	"gorm.io/driver/mysql"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
	"server/global"
	"server/initialize/internal"
)

func InitGormDB() (*gorm.DB, error) {
	m := global.XidwConfig.SysDB
	var db *gorm.DB
	var err error
	dsn, err := m.Dsn()
	if err != nil {
		return nil, errors.Errorf("sysDB dsn 获取失败:%v", err)
	}

	switch m.DbType {
	case "mysql":
		mysqlConfig := mysql.Config{
			DSN: dsn,
			DefaultStringSize: 191,
			SkipInitializeWithVersion: false,

		}
		if db, err := gorm.Open(mysql.New(mysqlConfig), internal.Gorm.Config(m.Prefix, m.Singular)); err != nil {
			return nil, err
		} else {
			db.InstanceSet("gorm:table_options", "ENGINE="+m.Engine)
			sqlDB, _ := db.DB()
			sqlDB.SetMaxIdleConns(m.MaxIdleConns)
			sqlDB.SetMaxOpenConns(m.MaxOpenConns)
			return db, nil
		}
	case "pgsql":
		pgsqlConfig := postgres.Config{
			DSN: dsn,
			PreferSimpleProtocol: false,
		}
		if db, err := gorm.Open(postgres.New(pgsqlConfig), internal.Gorm.Config(m.Prefix, m.Singular)); err != nil {
			return nil, err
		} else {
			sqlDB, _ := db.DB()
			sqlDB.SetMaxIdleConns(m.MaxIdleConns)
			sqlDB.SetMaxOpenConns(m.MaxOpenConns)
			return db, nil
		}
	default:
		return db, errors.Errorf("数据库类型不支持或是yaml sys-db数据配置不完整")
	}
}

func InitSysDb() {
	gormDB, err := InitGormDB()
	if err != nil {
		panic(fmt.Sprintf("获取sysDB的gormDB失败,err:%+v", err))
	}
	global.SysDB = gormDB
}

func InitOdsDb() {
	odsDB := global.XidwConfig.OdsDB
	sqlDB, err := odsDB.SqlDB()
	if err != nil {
		panic(fmt.Sprintf("获取odsDB的sqlDB失败,err:%+v", err))
	}
	global.OdsDB = sqlDB
}

func InitUdsDb() {
	udsDB := global.XidwConfig.UdsDB
	sqlDB, err := udsDB.SqlDB()
	if err != nil {
		panic(fmt.Sprintf("获取udsDB的sqlDB失败,err:%+v", err))
		return
	}
	global.UdsDB = sqlDB
}
